﻿/*
	注册：
	注册的基本流程：初始化eXosip库->接受一个事务(一个任务吧)->接着是对事件的处理->最后对消息进行一个分析，确认注册成功
	1.首先是对eXosip进行一个初始化，调用int eXosip_init (struct eXosip_t *exeXosipContext);函数进行初始化的设置，而函数里面的参数
	  是通过exosip_t来建立的，exosip_t 是exosip 中最重要的结构体之一，其中包含了exosip 中用到的各个子模块
      的结构代码中定义了一个该结构类型的全局变量，通过该全局变量，就可以对exosip前的状态进行掌控
    （许多相关的信息要么包含在该结构上，要么可以通过该结构找到）。
	 接着需要对sip端口进行一个监听，同样是利用库里的函数 eXosip_listen_addr (struct eXosip_t *exeXosipContext, int transport, const char *addr, int port, int family, int secure);
	进行一个调用。在此之前呢需要利用InitiateWinsock();进行socket的一个加载。这个函数其实是初始化了一个端口，这样我们后面才能用
	 eXosip_listen_addr()来进行一个端口的监视，这样我们可以通过wireshark来查看的到
	2.进行注册环节，首先定义一个事件je，je用来后期对注册传来的消息进行一个判断，然后确认注册是否成功，
*/
#include <eXosip2/eXosip.h>
#include <stdio.h>
#include <stdlib.h>
#include <Winsock2.h>
#include <windows.h>


int main()
{


	//初始化eXosip2库
	//首先分配一个eXoisp_t的结构体指针
	eXosip_t  *eXosipContext = eXosip_malloc();    //分配内存 ,eXosipContext 就相当于一个全局的指针，非常重要
	//关于内存的分配，必须给出判断
	if (eXosipContext == NULL)
	{
		printf("Can't get memory for that many values\n");
		system("pause");
	}
	printf("malloc is SUCCESS\n");

	//接着开始初始化
	int ret = 0;                           //定义一个变量，接受初始化后的返回值 0或1
	ret = eXosip_init(eXosipContext);      //对eXosipContext 进行初始化 
	/*
		如果返回了1 说明初始化失败，退出
	*/
	if (ret == 1)
	{
		printf("eXosip init is failure\n");
		system("pause");
	}
	printf("eXosip init is SUCCESS");

	/*对sip端口进行一个监听*/
	//InitiateWinsock();
	int port = 8080;
	ret = eXosip_listen_addr(eXosipContext, IPPROTO_UDP, NULL, port, AF_INET, 0);  //监听端口
    /*
		如果返回了1 说明监听失败，退出
	*/
	if (0 != ret)
	{
		eXosip_quit(eXosipContext);
		printf("eXosip_listen_addr error!\r\n");
		system("pause");
		return -1;
	}
	printf("eXosip_listen_addr success!\r\n");


	return 0;
}

int InitiateWinsock()
{
	int Error;
	WORD Version = MAKEWORD(2, 2);
	WSADATA WsaData;
	Error = WSAStartup(Version, &WsaData);	      //Start up WSA	  
	if (Error != 0)
		return 0;
	else
	{
		if (LOBYTE(WsaData.wVersion) != 2 || HIBYTE(WsaData.wHighVersion) != 2)
		{
			WSACleanup();
			return 0;
		}

	}
	return 1;
}